package cn.tedu.apps_system.controller;

import cn.tedu.apps_system.base.response.JsonResult;
import cn.tedu.apps_system.base.response.ResultCode;
import cn.tedu.apps_system.pojo.dto.*;
import cn.tedu.apps_system.pojo.vo.*;
import cn.tedu.apps_system.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 商家管理模块控制器，负责处理商家相关的请求。
 */
@RestController
@RequestMapping("/api/v1/Business")
@Api(tags = "商家管理模块")
public class MerchantController {

    @Autowired
    private MerchantService merchantService;

    @Autowired
    private ProductService productService;

    @Autowired
    private OrderService orderService;

    @Autowired
    private ReviewService reviewService;

    @Autowired
    private StatisticsService statisticsService;

    // 1.商家入驻

    /**
     * 添加店铺。
     *
     * @param merchantAddDTO 店铺信息DTO
     * @return 操作结果
     */
    @PostMapping("/shop/add")
    @ApiOperation("添加店铺")
    public JsonResult addShop(@RequestBody MerchantAddDTO merchantAddDTO) {
        merchantService.add(merchantAddDTO);
        return JsonResult.ok();
    }

    /**
     * 修改店铺信息。
     *
     * @param merchantUpdateDTO 店铺更新信息DTO
     * @return 操作结果
     */
    @PutMapping("/shop/revise")
    @ApiOperation("修改店铺信息")
    public JsonResult updateShop(@RequestBody MerchantUpdateDTO merchantUpdateDTO) {
        merchantService.update(merchantUpdateDTO);
        return JsonResult.ok();
    }

    /**
     * 删除店铺。
     *
     * @param id 店铺ID
     * @return 操作结果
     */
    @DeleteMapping("/shop/delete/{id}")
    @ApiOperation("删除店铺")
    public JsonResult deleteShop(@PathVariable Long id) {
        merchantService.delete(id);
        return JsonResult.ok();
    }

    // 2.商品管理

    /**
     * 添加商品。
     *
     * @param productAddDTO 商品信息DTO
     * @return 操作结果
     */
    @PostMapping("/product/add")
    @ApiOperation("添加商品")
    public JsonResult addProduct(@RequestBody ProductAddDTO productAddDTO) {
        productService.add(productAddDTO);
        return JsonResult.ok();
    }

    /**
     * 上架商品。
     *
     * @param id 商品ID
     * @return 操作结果
     */
    @PutMapping("/product/put/{id}")
    @ApiOperation("上架商品")
    public JsonResult putOnShelf(@PathVariable Long id) {
        productService.putOnShelf(id);
        return JsonResult.ok();
    }

    /**
     * 修改商品信息。
     *
     * @param productUpdateDTO 商品更新信息DTO
     * @return 操作结果
     */
    @PutMapping("/product/revise")
    @ApiOperation("修改商品信息")
    public JsonResult updateProduct(@RequestBody ProductUpdateDTO productUpdateDTO) {
        productService.update(productUpdateDTO);
        return JsonResult.ok();
    }

    /**
     * 下架商品。
     *
     * @param id 商品ID
     * @return 操作结果
     */
    @PutMapping("/product/remove/{id}")
    @ApiOperation("下架商品")
    public JsonResult takeOffShelf(@PathVariable Long id) {
        productService.takeOffShelf(id);
        return JsonResult.ok();
    }

    /**
     * 删除商品。
     *
     * @param id 商品ID
     * @return 操作结果
     */
    @DeleteMapping("/product/delete/{id}")
    @ApiOperation("删除商品")
    public JsonResult deleteProduct(@PathVariable Long id) {
        productService.delete(id);
        return JsonResult.ok();
    }

    /**
     * 查看商品评价。
     *
     * @param productId 商品ID
     * @return 商品评价列表
     */
    @GetMapping("/product/evaluation/{productId}")
    @ApiOperation("查看商品评价")
    public JsonResult listProductReviews(@PathVariable Long productId) {
        List<ReviewVO> reviews = reviewService.listByProductId(productId);
        return JsonResult.ok(reviews);
    }

    /**
     * 回复商品评价。
     *
     * @param reviewReplyDTO 评价回复信息DTO
     * @return 操作结果
     */
    @PutMapping("/product/replyevaluation")
    @ApiOperation("回复商品评价")
    public JsonResult replyReview(@RequestBody ReviewReplyDTO reviewReplyDTO) {
        reviewService.reply(reviewReplyDTO);
        return JsonResult.ok();
    }

    // 3.订单管理

    /**
     * 查看商家订单列表。
     *
     * @param merchantId 商家ID
     * @return 订单列表
     */
    @GetMapping("/generate/order/{merchantId}")
    @ApiOperation("查看商家订单列表")
    public JsonResult listOrders(@PathVariable Long merchantId) {
        List<OrderVO> orders = orderService.listByMerchantId(merchantId);
        return JsonResult.ok(orders);
    }

    /**
     * 查看订单详情。
     *
     * @param id 订单ID
     * @return 订单详情
     */
    @GetMapping("/select/order/{id}")
    @ApiOperation("查看订单详情")
    public JsonResult getOrder(@PathVariable Long id) {
        OrderVO order = orderService.getById(id);
        return JsonResult.ok(order);
    }

    /**
     * 按状态查看订单。
     *
     * @param merchantId 商家ID
     * @param status 订单状态
     * @return 订单列表
     */
    @GetMapping("/select/order/status/{merchantId}/{status}")
    @ApiOperation("按状态查看订单")
    public JsonResult listOrdersByStatus(@PathVariable Long merchantId,
                                         @PathVariable Integer status) {
        List<OrderVO> orders = orderService.listByMerchantIdAndStatus(merchantId, status);
        return JsonResult.ok(orders);
    }

    /**
     * 删除订单。
     *
     * @param id 订单ID
     * @return 操作结果
     */
    @DeleteMapping("/delete/order/{id}")
    @ApiOperation("删除订单")
    public JsonResult deleteOrder(@PathVariable Long id) {
        orderService.delete(id);
        return JsonResult.ok();
    }

    // 4.销售统计

    /**
     * 获取销售统计信息。
     *
     * @param merchantId 商家ID
     * @return 销售统计信息
     */
    @GetMapping("/count/{merchantId}")
    @ApiOperation("销售统计")
    public JsonResult getSalesStatistics(@PathVariable Long merchantId) {
        SalesStatisticsVO statistics = statisticsService.getSalesStatistics(merchantId);
        return JsonResult.ok(statistics);
    }
}